package com.hdp.kotlin_samples.base

/**
 * author:hdp
 * on:2019/6/11:18:08
 * desc:kotlin中的基本数据类型
 *
 * Int、Long、Short、Char（kotlin中为独立类型）、
 * Float、Double、
 * 可以看出，Kotlin的基本数据类型，写法和Java基本数据类型的包装类是一样的（除了int的Integer）
 * val:val为只读标志，声明后不能更改，相当于Java中的final
 * var:var声明的变量可以修改值
 * 注1：在 Kotlin 中，字符（Char）不算数字类型，在 Java 中 char 被算入数字类型的整数类型中。
 *
 * ==比较和===比较
 * 1、简言之：kotlin中的"===" => Java中的==，比较地址
 *      Kotlin的"==" 与Java语言的equals方法功能相同，比较内容
 * 2、数值的比较：
 *      1、Kotlin和Java一致：会对在[-128,127]范围内的Integer对象进行缓存，
 *      也就是说当创建在此范围内的Integer对象时，若缓存中存在，则不会创建新的对象，
 *      即此范围内的值相等的Integer对象，比较引用地址时，是相同的。
 *      2、Kotlin中的可空类型，比较时相当于Java里的包装类型
 *      3、Kotlin中的不可空类型，比较时相当于Java里的基本类型
 * 3、字符串的比较：
 *
 */
class BasicTypeTips {
    //1、声明变量
    var i = 0                       //自动推断为整型
    var j: Int = 18                 //声明变量类型
    var d = 18.3                    //默认是Double
    var f: Float = 18.3f            //声明FloatL类型
    var char_a = 'A'
    var name = "test"               //自动推断为字符串，可变
    val userName = "ywq"            //自动推断为字符串，不可变
    var nullAbleStr: String? = null //声明可能为空的字符串变量
}


fun main() {
    val baseTypeTips = BasicTypeTips()
    baseTypeTips.d = 128.32
    println(baseTypeTips.i)
    println(baseTypeTips.j)
    println(baseTypeTips.d)
    println(baseTypeTips.f)
    println(baseTypeTips.name)
//    baseTypeTips.nullAbleStr = "花最少的钱，玩最好的手机，牛逼"
    println(baseTypeTips.nullAbleStr)
    println(baseTypeTips.nullAbleStr?.length)
    //Kotlin的 == 与Java的 == 的对比在于：Java的 == 是比较字符串的内存地址，Kotlin的 == 与Java语言的equals方法相等。
    //Kotlin中===比内存地址
    println("=================Int_比较====================")
    val intA = 12000
    val int1: Int = intA    //不可空的Int会转成Java里的基本类型
    val int2: Int = intA
    println("int1==int2: ${int1 == int2}")
    println(message = "int1===int2:" + (int1 === int2))

    val intB = 1000
    var boxedA: Int? = null   //可空的Int自动装箱，-128至127会从缓存池获取
    boxedA = intB
    val anotherBoxedA: Int? = intB
    println("boxedA == anotherBoxedA：${boxedA == anotherBoxedA}")
    println("boxedA === anotherBoxedA:${boxedA === anotherBoxedA}")

    println("=================Float类型_比较====================")
    var floatA: Float = 123.0f
    var floatB: Float? = 123.0f
    println("floatA==floatB:${floatA == floatB}")
    @Suppress("DEPRECATED_IDENTITY_EQUALS")
    println("floatA===floatB:${floatA === floatB}")

    println("=================String_比较====================")
    val str1 = "abc"
    val str2 = "abc"
    val str3 = String(str1.toByteArray())   //相当于java里面 new String("abc")
    println("str1 == str2:${str1 == str2}")
    println("str1 === str2:${str1 === str2}")
    println("str2 == str3:${str2 == str3}")
    println("str2 === str3:${str2 === str3}")
}


